home *** CD-ROM | disk | FTP | other *** search
/ Aminet 33 / Aminet 33 - October 1999.iso / Aminet / util / misc / VMM_src.lha / VMM / MUI / task_page.c < prev    next >
Encoding:
C/C++ Source or Header  |  1995-12-16  |  13.0 KB  |  440 lines

  1. #include "defs.h"
  2.  
  3. char *CodeEntries [3];
  4. char *DataEntries [4];
  5.  
  6. static struct Hook ConstructHook,
  7.                    DestructHook,
  8.                    DisplayHook,
  9.                    CompareHook,
  10.                    SelectHook,
  11.                    EntrySelectedHook;
  12.  
  13. /***********************************************************************/
  14.  
  15. #ifdef __GNUC__
  16. static struct TaskEntry *ConstructElem (struct Hook *hook, struct TaskEntry *te)
  17. #else
  18. static __saveds __asm struct TaskEntry *ConstructElem (register __a1 struct TaskEntry *te)
  19. #endif
  20.  
  21. {
  22. struct TaskEntry *new;
  23.  
  24. if ((new = AllocMem (sizeof (struct TaskEntry), MEMF_PUBLIC)) == NULL)
  25.   return (NULL);
  26.  
  27. *new = *te;
  28.  
  29. if ((new->te_TaskName = AllocMem ((ULONG)new->te_teif.NameLen, MEMF_PUBLIC)) == NULL)
  30.   {
  31.   FreeMem (new, sizeof (struct TaskEntry));
  32.   return (NULL);
  33.   }
  34.  
  35. strcpy (new->te_TaskName, te->te_TaskName);
  36. return (new);
  37. }
  38.  
  39. /***********************************************************************/
  40.  
  41. #ifdef __GNUC__
  42. static void DestructElem (struct Hook *hook, struct TaskEntry *te)
  43. #else
  44. static __saveds __asm void DestructElem (register __a1 struct TaskEntry *te)
  45. #endif
  46.  
  47. {
  48. FreeMem (te->te_TaskName, (ULONG)te->te_teif.NameLen);
  49. FreeMem (te, sizeof (struct TaskEntry));
  50. }
  51.  
  52. /***********************************************************************/
  53.  
  54. #ifdef __GNUC__
  55. static LONG DisplayElem (struct Hook *hook, struct TaskEntry *te, char **array)
  56. #else
  57. static __saveds __asm LONG DisplayElem (register __a1 struct TaskEntry *te,
  58.                                         register __a2 char **array)
  59. #endif
  60.  
  61. {
  62. static char title_buf [50];
  63.  
  64. if (te == NULL)
  65.   {
  66.   *array++ = GetVMMString (msgCode);
  67.   *array++ = GetVMMString (msgData);
  68.   strcpy (title_buf, "\33c");
  69.   strcat (title_buf, GetVMMString (msgTasksProgs));
  70.   *array++ = title_buf;
  71.   }
  72. else
  73.   {
  74.   *array++ = te->te_teif.CodePaging ? GetVMMString (msgUseCodeShort) : GetVMMString (msgNoUseCodeShort);
  75.  
  76.   switch (te->te_teif.DataPaging)
  77.     {
  78.     case DP_FALSE: *array++ = GetVMMString (msgNoUseDataShort); break;
  79.     case DP_TRUE:  *array++ = GetVMMString (msgUseDataShort); break;
  80.     case DP_ADVANCED: *array++ = GetVMMString (msgAdvancedDataShort); break;
  81.     }
  82.  
  83.   *array++ = te->te_TaskName;
  84.   }
  85.  
  86. return (0);
  87. }
  88.  
  89. /***********************************************************************/
  90.  
  91. #ifdef __GNUC__
  92. static LONG CompareElems (struct Hook *hook, struct TaskEntry *te1, 
  93.                           struct TaskEntry *te2)
  94. #else
  95. static __saveds __asm LONG CompareElems (register __a1 struct TaskEntry *te1,
  96.                                          register __a2 struct TaskEntry *te2)
  97. #endif
  98.  
  99. {
  100. if (te1->te_teif.IsDefault)
  101.   return (-1);
  102. else if (te2->te_teif.IsDefault)
  103.   return (1);
  104. else
  105.   return (Stricmp (te1->te_TaskName, te2->te_TaskName));
  106. }
  107.  
  108. /***********************************************************************/
  109.  
  110. #ifdef __GNUC__
  111. static void SelectElem (void)
  112. #else
  113. static __saveds __asm void SelectElem (void)
  114. #endif
  115.  
  116. {
  117. struct TaskEntry *te;
  118. LONG pos,
  119.      num_entries;
  120.  
  121. DoMethod (LV_TaskList, MUIM_List_GetEntry, MUIV_List_GetEntry_Active,
  122.           &te);
  123.  
  124. if (te == NULL)
  125.   /* This can only happen by clearing the list */
  126.   return;
  127.  
  128. get (LV_TaskList, MUIA_List_Active, &pos);
  129. get (LV_TaskList, MUIA_List_Entries, &num_entries);
  130.  
  131. set (BT_Top,    MUIA_Disabled, pos <= 1);
  132. set (BT_Up,     MUIA_Disabled, pos <= 1);
  133. set (BT_Down,   MUIA_Disabled, pos == 0 || pos == num_entries - 1);
  134. set (BT_Bottom, MUIA_Disabled, pos == 0 || pos == num_entries - 1);
  135. set (BT_Delete, MUIA_Disabled, pos == 0);
  136.  
  137. if (te->te_teif.IsDefault)
  138.   {
  139.   set (ST_CurrentTask, MUIA_Disabled, TRUE);
  140.   set (ST_CurrentTask, MUIA_String_Contents, NULL);
  141.   }
  142. else
  143.   {
  144.   set (ST_CurrentTask, MUIA_Disabled, FALSE);
  145.   set (ST_CurrentTask, MUIA_String_Contents, te->te_TaskName);
  146.   }
  147.  
  148. set (CY_CodeOptions, MUIA_Cycle_Active, te->te_teif.CodePaging);
  149. set (CY_DataOptions, MUIA_Cycle_Active, te->te_teif.DataPaging);
  150. set (ST_MinPublic,    MUIA_String_Integer, te->te_teif.MinPublic);
  151. set (ST_MinNonPublic, MUIA_String_Integer, te->te_teif.MinNonPublic);
  152. }
  153.  
  154. /***********************************************************************/
  155.  
  156. Object *MyButton (APTR label, APTR shortcut)
  157.  
  158. {
  159. /* The KeyButton macro needs a character as its second argument,
  160.  * but GetVMMString returns a string. This will convert it and
  161.  * call the macro.
  162.  */
  163. char *tmp;
  164.  
  165. tmp = GetVMMString (shortcut);
  166. return (KeyButton (GetVMMString (label), *tmp));
  167. }
  168.  
  169. /***********************************************************************/
  170.  
  171. Object *CreateTaskPage (void)
  172.  
  173. {
  174. InitHook (&ConstructHook, (HOOKFUNC) ConstructElem);
  175. InitHook (&DestructHook, (HOOKFUNC) DestructElem);
  176. InitHook (&DisplayHook, (HOOKFUNC) DisplayElem);
  177. InitHook (&CompareHook, (HOOKFUNC) CompareElems);
  178. InitHook (&SelectHook, (HOOKFUNC) SelectElem);
  179.  
  180. DataEntries [0] = CodeEntries [0] = GetVMMString (msgDontUseVM);
  181. DataEntries [1] = CodeEntries [1] = GetVMMString (msgUseVM);
  182. CodeEntries [2] = NULL;
  183. DataEntries [2] = GetVMMString (msgAdvancedOptions);
  184. DataEntries [3] = NULL;
  185.  
  186. LV_TaskList = ListviewObject,
  187.                 MUIA_Listview_Input, TRUE,
  188.                 MUIA_Listview_List,
  189.                   ListObject,
  190.                     MUIA_Frame, MUIV_Frame_InputList,
  191.                     MUIA_List_DisplayHook, &DisplayHook,
  192.                     MUIA_List_CompareHook, &CompareHook,
  193.                     MUIA_List_ConstructHook, &ConstructHook,
  194.                     MUIA_List_DestructHook, &DestructHook,
  195.                     MUIA_List_Title, TRUE,
  196.                     MUIA_List_Format, "P=\33c,P=\33c,",
  197.                   End,
  198.               End;
  199.  
  200. ST_CurrentTask = StringObject,
  201.                    MUIA_Disabled, TRUE,
  202.                    StringFrame,
  203.                    MUIA_String_AttachedList, LV_TaskList,
  204.                    MUIA_String_MaxLen, 10000,
  205.                  End;
  206.  
  207. GR_TaskList = VGroup,
  208.                 Child, LV_TaskList,
  209.                 Child, ST_CurrentTask,
  210.               End;
  211.                 
  212. GR_OrderButtons = ColGroup (2),
  213.                     Child, BT_AddProg = MyButton (msgAddProg, msgAddProgShort),
  214.                     Child, BT_Top =     MyButton (msgTop, msgTopShort),
  215.                     Child, BT_AddDir =  MyButton (msgAddDir, msgAddDirShort),
  216.                     Child, BT_Up =      MyButton (msgUp, msgUpShort),
  217.                     Child, BT_AddTask = MyButton (msgAddTask, msgAddTaskShort),
  218.                     Child, BT_Down =    MyButton (msgDown, msgDownShort),
  219.                     Child, BT_Add =     MyButton (msgAdd, msgAddShort),
  220.                     Child, BT_Bottom =  MyButton (msgBottom, msgBottomShort),
  221.                     Child, BT_Delete =  MyButton (msgDelete, msgDeleteShort),
  222.                     Child, BT_Sort = MyButton (msgSort, msgSortShort),
  223.                   End;
  224.  
  225. GR_TaskButtons = VGroup,
  226.                    MUIA_HorizWeight, 10,
  227.                    Child, GR_OrderButtons,
  228.                    Child, VSpace (0),
  229.                  End;
  230.  
  231. GR_TaskSub = HGroup,
  232.                Child, GR_TaskList,
  233.                Child, GR_TaskButtons,
  234.              End;
  235.  
  236. GR_VMPermissions = ColGroup (5),
  237.                      Child, Label (GetVMMString (msgCode)),
  238.                      Child, CY_CodeOptions = 
  239.                        CycleObject,
  240.                          MUIA_HorizWeight, 40,
  241.                          MUIA_Cycle_Entries, CodeEntries,
  242.                        End,
  243.                      Child, HSpace (0), 
  244.                      Child, Label (GetVMMString (msgMinPublic)),
  245.                      Child, ST_MinPublic = 
  246.                        StringObject,
  247.                          MUIA_Frame, MUIV_Frame_String,
  248.                          MUIA_Disabled, TRUE,
  249.                          MUIA_String_Accept, "-0123456789",
  250.                          MUIA_String_Format, MUIV_String_Format_Right,
  251.                          MUIA_String_Integer, 0,
  252.                        End,
  253.                      Child, Label (GetVMMString (msgData)),
  254.                      Child, CY_DataOptions =
  255.                        CycleObject,
  256.                          MUIA_HorizWeight, 40,
  257.                          MUIA_Cycle_Entries, DataEntries,
  258.                        End,
  259.                      Child, HSpace (0),
  260.                      Child, Label (GetVMMString (msgMinNonPublic)),
  261.                      Child, ST_MinNonPublic =
  262.                        StringObject, 
  263.                          MUIA_Frame, MUIV_Frame_String,
  264.                          MUIA_Disabled, TRUE,
  265.                          MUIA_String_Accept, "-0123456789",
  266.                          MUIA_String_Format, MUIV_String_Format_Right,
  267.                          MUIA_String_Integer, 0,
  268.                        End,
  269.                    End;
  270.  
  271. GR_Tasks = VGroup,
  272.              MUIA_Frame, MUIV_Frame_Group,
  273.              MUIA_HelpNode, "Tasks_Gadget",
  274.              Child, GR_TaskSub,
  275.              Child,
  276.                RectangleObject,
  277.                  MUIA_Rectangle_HBar, TRUE,
  278.                  MUIA_Weight, 0,
  279.                End,
  280.              Child, GR_VMPermissions,
  281.            End;
  282.  
  283. DoMethod (CY_DataOptions, MUIM_Notify, MUIA_Cycle_Active, DP_FALSE, 
  284.           ST_MinNonPublic, 3, MUIM_Set, MUIA_Disabled, TRUE);
  285. DoMethod (CY_DataOptions, MUIM_Notify, MUIA_Cycle_Active, DP_TRUE, 
  286.           ST_MinNonPublic, 3, MUIM_Set, MUIA_Disabled, TRUE);
  287. DoMethod (CY_DataOptions, MUIM_Notify, MUIA_Cycle_Active, DP_ADVANCED, 
  288.           ST_MinNonPublic, 3, MUIM_Set, MUIA_Disabled, FALSE);
  289. DoMethod (CY_DataOptions, MUIM_Notify, MUIA_Cycle_Active, DP_FALSE, 
  290.           ST_MinPublic, 3, MUIM_Set, MUIA_Disabled, TRUE);
  291. DoMethod (CY_DataOptions, MUIM_Notify, MUIA_Cycle_Active, DP_TRUE, 
  292.           ST_MinPublic, 3, MUIM_Set, MUIA_Disabled, TRUE);
  293. DoMethod (CY_DataOptions, MUIM_Notify, MUIA_Cycle_Active, DP_ADVANCED, 
  294.           ST_MinPublic, 3, MUIM_Set, MUIA_Disabled, FALSE);
  295.  
  296. DoMethod (LV_TaskList, MUIM_Notify, MUIA_List_Active, MUIV_EveryTime,
  297.           LV_TaskList, 2, MUIM_CallHook, &SelectHook);
  298.  
  299. return (GR_Tasks);
  300. }
  301.  
  302. /***********************************************************************/
  303.  
  304. static void AddTaskToSelectList (struct Task *task)
  305.  
  306. {
  307. struct Process *cur_proc;
  308. struct CommandLineInterface *CLI;
  309. char *name;
  310. char my_buffer [200];
  311.  
  312. cur_proc = (struct Process*) task;
  313. CLI = BADDR (cur_proc->pr_CLI);
  314.  
  315. if ((task->tc_Node.ln_Type == NT_PROCESS) && (CLI != NULL) &&
  316.     (CLI->cli_CommandName != NULL))
  317.   {
  318.   name = BADDR (CLI->cli_CommandName);
  319.   if (*name != 0)
  320.     {
  321.     strncpy (my_buffer, name + 1, *name);
  322.     my_buffer [*name] = 0;    /* bug in strncpy of SAS/C */
  323.     name = FilePart (my_buffer);
  324.     }
  325.   else
  326.     name = task->tc_Node.ln_Name;
  327.   }
  328. else
  329.   name = task->tc_Node.ln_Name;
  330.  
  331. if (strncmp (PROGNAME, name, strlen (PROGNAME)) != 0)
  332.   DoMethod (LV_TaskSelect, MUIM_List_InsertSingle, name,
  333.             MUIV_List_Insert_Bottom);
  334.  
  335. }
  336.  
  337. /***********************************************************************/
  338.  
  339. void BuildTaskList (void)
  340.  
  341. {
  342. struct Node *current;
  343.  
  344. set (WI_Window, MUIA_Window_Sleep, TRUE);
  345. DoMethod (LV_TaskSelect, MUIM_List_Clear);
  346.  
  347. Forbid ();
  348.  
  349. for (current = SysBase->TaskReady.lh_Head; current->ln_Succ != NULL;
  350.      current = current->ln_Succ)
  351.   AddTaskToSelectList ((struct Task*) current);
  352.  
  353. for (current = SysBase->TaskWait.lh_Head; current->ln_Succ != NULL;
  354.      current = current->ln_Succ)
  355.   AddTaskToSelectList ((struct Task*) current);
  356.  
  357. Permit ();
  358.  
  359. DoMethod (LV_TaskSelect, MUIM_List_Sort);
  360.  
  361. set (WI_TaskSelect, MUIA_Window_Open, TRUE);
  362. }
  363.  
  364. /***********************************************************************/
  365.  
  366. #ifdef __GNUC__
  367. static void EntrySelected (void)
  368. #else
  369. static __saveds __asm void EntrySelected (void)
  370. #endif
  371.  
  372. {
  373. char *name;
  374.  
  375. DoMethod (LV_TaskSelect, MUIM_List_GetEntry, MUIV_List_GetEntry_Active, &name);
  376. AddNamed (name);
  377. set (WI_TaskSelect, MUIA_Window_Open, FALSE);
  378. set (WI_Window, MUIA_Window_Sleep, FALSE);
  379. }
  380.  
  381. /***********************************************************************/
  382.  
  383. Object *CreateTaskSelectWindow (void)
  384.  
  385. {
  386. Object *win;
  387.  
  388. win = WindowObject,
  389.         MUIA_Window_Title, GetVMMString (msgSelectTask),
  390.         MUIA_Window_CloseGadget, TRUE,
  391.         MUIA_Window_ID, 2,
  392.         MUIA_HelpNode, "Tasks_Gadget",
  393.         WindowContents, LV_TaskSelect =
  394.           ListviewObject,
  395.             MUIA_Listview_Input, TRUE,
  396.             MUIA_Listview_List,
  397.               ListObject,
  398.                 MUIA_Frame, MUIV_Frame_InputList,
  399.                 MUIA_List_ConstructHook, MUIV_List_ConstructHook_String,
  400.                 MUIA_List_DestructHook, MUIV_List_DestructHook_String,
  401.               End,
  402.           End,
  403.       End;
  404.  
  405. DoMethod (win, MUIM_Notify, MUIA_Window_CloseRequest, TRUE,
  406.           win, 
  407.           3, MUIM_Set, MUIA_Window_Open, FALSE);
  408.  
  409. InitHook (&EntrySelectedHook, (HOOKFUNC) EntrySelected);
  410.  
  411. DoMethod (LV_TaskSelect, MUIM_Notify, MUIA_Listview_DoubleClick, TRUE,
  412.           win,
  413.           2, MUIM_CallHook, &EntrySelectedHook);
  414.  
  415. return (win);
  416. }
  417.  
  418. /***********************************************************************/
  419.  
  420. void AddNamed (char *name)
  421.  
  422. {
  423. LONG pos;
  424. struct TaskEntry te,
  425.                 *cur_active;
  426.  
  427. get (LV_TaskList, MUIA_List_Active, &pos);
  428. DoMethod (LV_TaskList, MUIM_List_GetEntry, pos, &cur_active);
  429.  
  430. te = *cur_active;
  431. te.te_teif.IsDefault = FALSE;
  432. te.te_TaskName = name;
  433.  
  434. set (LV_TaskList, MUIA_List_Quiet, TRUE);
  435. DoMethod (LV_TaskList, MUIM_List_InsertSingle, &te, pos + 1);
  436. set (LV_TaskList, MUIA_List_Active, pos + 1);
  437. set (LV_TaskList, MUIA_List_Quiet, FALSE);
  438. }
  439.  
  440.